//架构管理
var express = require('express');
var Msdb = require("../../../db/Mysqldb.js");
var router = express.Router();   //可使用 express.Router 类创建模块化、可挂载的路由句柄

var db = new Msdb();
var getTime=()=>{
    return new Date(new Date().getTime()+8 * 60 * 60 * 1000).toISOString().slice(0, 19).replace('T', ' ');//获取系统时间并转为数据库接受的格式
}

async function returnFramework(id){//返回整个组织架构
    var children=await db.query(`SELECT * FROM framework WHERE parent_framework_id = ?`,[id])//获取该节点的子节点
    for(var i=0;i<children.length;i++){//添加children,value与key属性
        children[i]={
            ...children[i],
            children:[],
            value:children[i].id,
            key:children[i].id
        }
    }
    for(var i=0;i<children.length;i++){//遍历子节点
        var childrens=await returnFramework(children[i].id)//每个子节点再进行相同的操作
        for(var j=0;j<childrens.length;j++){
            children[i].children.push(childrens[j])
        }
    }
    //子节点遍历完
    return children
}

router.get('/getFramework',async function(req,res) {//获取公司的组织架构
    var result=[]
    var root=await db.query(`SELECT * FROM framework WHERE parent_framework_id IS NULL`)//获取根节点
    var children=await returnFramework(root[0].id)
    result=[{
        title:root[0].title,
        key:root[0].id,
        id:root[0].id,
        value:root[0].id,
        children:children
    }]
    res.send(JSON.stringify(result))
})

router.post('/deleteFramework',async function(req,res) {//删除组织架构，仅允许超级管理员与系统运维专员可删除与新增组织架构
    // 获取数据库连接
    const connection = await db.getConnection();
    var result={}
    var data=req.body
    
    try {
        if(req.auth.role_id==1||req.auth.role_id==3){//权限校验通过
            // 开启事务
            await db.beginTransaction(connection);
            
            for(var i=0;i<data.frameworkIds.length;i++){
                // 将属于要删除架构的人员归类到空
                await connection.execute(`UPDATE user SET framework_id=NULL WHERE framework_id=?`,[data.frameworkIds[i]]);
                
                // 将该组织架构删除
                await connection.execute(`DELETE FROM framework WHERE id=?`,[data.frameworkIds[i]]);
                
                // 记录操作日志
                var sql_words=`DELETE FROM framework WHERE id=${data.frameworkIds[i]}`;
                var time=getTime();
                await connection.execute(`INSERT INTO operation_log (user_id,sql_words,time) VALUES (?,?,?);`,[req.auth.user_id,sql_words,time]);
            }
            
            // 提交事务
            await db.commit(connection);
            
            result={
                code:200,
                msg:"删除成功"
            }
        } else {
            result={
                code:201,
                msg:"当前账号不属于超级管理员/系统运维专员，无法删除架构！"
            }
        }
        res.send(JSON.stringify(result));
    } catch (error) {
        // 回滚事务
        await db.rollback(connection);
        result={
            code:500,
            msg:"服务器错误，删除架构失败"
        }
        res.send(JSON.stringify(result));
    } finally {
        // 释放连接
        connection.release();
    }
})

router.post('/addFramework',async function(req,res) {//新增组织架构，仅允许超级管理员与系统运维专员可删除与新增组织架构
    // 获取数据库连接
    const connection = await db.getConnection();
    var result={}
    var data=req.body
    
    try {
        if(req.auth.role_id==1||req.auth.role_id==3){//权限校验通过
            // 检查部门是否已存在
            const [idsResult] = await connection.execute(
                `SELECT id FROM framework WHERE title=? AND parent_framework_id=?`,
                [data.newFramework.title, data.newFramework.parent_framework_id]
            );
            const ids = idsResult;
            
            if(ids.length!=0){
                result={
                    code:201,
                    msg:"当前部门在同级架构下已存在，请修改部门名称"
                }
                res.send(JSON.stringify(result));
                return;
            }
            
            // 开启事务
            await db.beginTransaction(connection);
            
            // 新增架构
            await connection.execute(
                `INSERT INTO framework (title,parent_framework_id) VALUES (?,?)`,
                [data.newFramework.title, data.newFramework.parent_framework_id]
            );
            
            // 记录操作日志
            var sql_words=`INSERT INTO framework (title,parent_framework_id) VALUES (${data.newFramework.title},${data.newFramework.parent_framework_id})`;
            var time=getTime();
            await connection.execute(
                `INSERT INTO operation_log (user_id,sql_words,time) VALUES (?,?,?);`,
                [req.auth.user_id, sql_words, time]
            );
            
            // 提交事务
            await db.commit(connection);
            
            result={
                code:200,
                msg:"新增架构成功！"
            }
        } else {
            result={
                code:201,
                msg:"当前账号不属于超级管理员/系统运维专员，无法新增架构！"
            }
        }
        res.send(JSON.stringify(result));
    } catch (error) {
        // 回滚事务
        await db.rollback(connection);
        result={
            code:500,
            msg:"服务器错误，新增架构失败"
        }
        res.send(JSON.stringify(result));
    } finally {
        // 释放连接
        connection.release();
    }
})

router.post('/getFrameworkInfoById',async function(req,res) {//通过组织id，查看某个部门/公司的详细信息与其直属员工
    var result={}
    var data=req.body
    var tmp=await db.query(`SELECT * FROM framework WHERE id=?`,[data.frameworkId])//查询标题
    var list=await db.query(`SELECT * FROM user WHERE framework_id=? LIMIT ? OFFSET ?;`,[data.frameworkId,data.pageSize,data.offset])
    const [countResult] = await db.query(`SELECT COUNT(*) AS total FROM user WHERE framework_id=?`,[data.frameworkId]);//统计部门员工总数
    result={
        title:tmp[0].title,
        id:tmp[0].id,
        total:countResult.total,
        data:list
    }
    res.send(JSON.stringify(result))
})

router.post('/editFramework',async function(req,res) {//用户更新组织架构
    // 获取数据库连接
    const connection = await db.getConnection();
    var result={}
    var data=req.body
    
    try {
        if(req.auth.role_id==1||req.auth.role_id==3){//权限校验通过
            // 开启事务
            await db.beginTransaction(connection);
            
            // 更新架构
            await connection.execute(
                `UPDATE framework SET title=? WHERE id=?`,
                [data.newEditFramework.title, data.newEditFramework.id]
            );
            
            // 记录操作日志
            var sql_words=`UPDATE framework SET title=${data.newEditFramework.title} WHERE id=${data.newEditFramework.id}`;
            var time=getTime();
            await connection.execute(
                `INSERT INTO operation_log (user_id,sql_words,time) VALUES (?,?,?);`,
                [req.auth.user_id, sql_words, time]
            );
            
            // 提交事务
            await db.commit(connection);
            
            result={
                code:200,
                msg:"修改架构成功！"
            }
        } else {
            result={
                code:201,
                msg:"当前账号不属于超级管理员/系统运维专员，无法编辑架构！"
            }
        }
        res.send(JSON.stringify(result));
    } catch (error) {
        // 回滚事务
        await db.rollback(connection);
        result={
            code:500,
            msg:"服务器错误，编辑架构失败"
        }
        res.send(JSON.stringify(result));
    } finally {
        // 释放连接
        connection.release();
    }
})

module.exports = router;